#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "ctype.h"
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

#ifndef TRUE
#define TRUE   1
#endif
#ifndef FALSE
#define FALSE    0
#endif


/***********************************************************************
* 函数名   :configFileDelRightTrim
* 功能描述 :删除右边的空格
* 输入参数 : 无
* 输出参数 : 无
* 返回值   : 无
*/
void configFileDelRightTrim(char *cpStr)
{
	int i = 0;

	if(cpStr == NULL)
	{
		return ;
	}

	//
	for(i = strlen(cpStr); i > 0; i--)
	{
		if(isspace(cpStr[i - 1]))
		{
			cpStr[i - 1] = 0;
		}
		else
		{
			break;
		}
	}
}

/***********************************************************************
* 函数名   :configFileDelLeftTrim
* 功能描述 :删除左边的空格
* 输入参数 : 无
* 输出参数 : 无
* 返回值   : 无
*/
void configFileDelLeftTrim(char *cpStr)
{
	int i = 0;
	int count = 0;
	int len  = 0;

	if(cpStr == NULL)
	{
		return ;
	}

	for(i = 0; i < strlen(cpStr); i++)
	{
		if(isspace(cpStr[i]))
		{
			count++;
		}
		else
		{
			break;
		}
	}

	if(count == 0)
	{
		return ;
	}
	else
	{
		len = strlen(cpStr) - count;
		memcpy(cpStr,cpStr + count,len);
		cpStr[len] = 0;
	}
}



/***********************************************************************
* 函数名   :configFileIsNotes
* 功能描述 :
* 输入参数 : 无
* 输出参数 : 无
* 返回值   : 无
*/
int configFileIsNotes(char *buf)
{
	if(buf == NULL)
	{
		return FALSE;
	}

	while(*buf != 0)
	{
		if(isspace(*buf))
		{
			buf++;
			continue;
		}

		if(*buf == '#')
		{
			return TRUE;
		}
		else
		{
			return FALSE;
		}
	}
}

/***********************************************************************
* 函数名   :configFileStrGet
* 功能描述 :
* 输入参数 : 无
* 输出参数 : 无
* 返回值   : 无
*/
int configFileStrGet(char *confFile,char *cpName,char *cpValue,int iValueLen)
{
	FILE *fp = NULL;
	char buf[512];
	char *cpStr = NULL;
	char *cpNamePtr = NULL;
	char *cpValuePtr = NULL;

	if(confFile == NULL || cpName == NULL || cpValue == NULL)
	{
		return -1;
	}
	if((fp = fopen(confFile,"r" )) == NULL)
	{
		printf("configFile %s open failed\r\n",confFile);
		return -1;
	}

	memset(buf,0,sizeof(buf));
	while((0 == feof(fp)) && (fgets(buf,sizeof(buf) - 1,fp) != NULL))
	{
		if(TRUE == configFileIsNotes(buf))
		{
			memset(buf,0,sizeof(buf));
			continue;
		}

		cpValuePtr = buf;
		cpNamePtr = strsep(&cpValuePtr,"=");
		if((cpNamePtr != NULL) && (cpValuePtr != NULL))
		{
			configFileDelLeftTrim(cpNamePtr);
			configFileDelRightTrim(cpNamePtr);
			//此处由于value本身不是null所以应该第一次返回不为null（肯定）
			cpValuePtr = strsep(&cpValuePtr,"#");
			configFileDelLeftTrim(cpValuePtr);
			configFileDelRightTrim(cpValuePtr);
			if(strcmp(cpNamePtr,cpName) == 0)
			{
				snprintf(cpValue,iValueLen,"%s",cpValuePtr);
				printf("configfile:%s readname:%s value:%s\n",confFile,cpName,cpValue);
				fclose(fp);
				return 0;
			}
		}
		memset(buf,0,sizeof(buf));
	}
	fclose(fp);
	printf("configfile:%s readname:%s value:%s\n",confFile,cpName,cpValue);
	return -1;
}


/***********************************************************************
* 函数名   :configFileIntGet
* 功能描述 :
* 输入参数 : 无
* 输出参数 : 无
* 返回值   : 无
*/
int configFileIntGet(char *confFile,char *cpName,int *iValue)
{
	char buf[64];
	int ret = 0;

	memset(buf,0,sizeof(buf));
	ret = configFileStrGet(confFile,cpName,buf,sizeof(buf));
	if(ret != 0)
	{
		return -1;
	}

	*iValue = atoi(buf);
	return 0;
}

/***********************************************************************
* 函数名   :configFileStrSet
* 功能描述 :
* 输入参数 : 无
* 输出参数 : 无
* 返回值   : 无
*/
int configFileStrSet(char *confFile,char *cpName,char *cpValue)
{
	FILE *fp = NULL;
	char buf[512];
	char srcBuf[512];
	char configTempFile[1024];
	char *cpValueStr = NULL;
	char *cpNamePtr = NULL;
	int fd;
	int findName = FALSE;

	if(confFile == NULL || cpName == NULL || cpValue == NULL)
	{
		return -1;
	}
	if((fp = fopen(confFile,"rw")) == NULL)
	{
		printf("configFile %s open failed\r\n",confFile);
		return -1;
	}

	memset(configTempFile,0,sizeof(configTempFile));
	sprintf(configTempFile,"%s.tmp",confFile);
	fd = open(configTempFile,O_CREAT | O_RDWR,0777);
	if(fd < 0)
	{
		printf("open file %s failed\r\n",configTempFile);
		return -1;
	}

	memset(buf,0,sizeof(buf));
	while((0 == feof(fp)) && (fgets(buf,sizeof(buf),fp) != NULL))
	{
		if(TRUE == configFileIsNotes(buf))
		{
			memset(buf,0,sizeof(buf));
			continue;
		}

		cpValueStr = buf;

		memset(srcBuf,0,sizeof(srcBuf));
		strcpy(srcBuf,buf);
		cpNamePtr = strsep(&cpValueStr,"=");
		if((cpNamePtr != NULL) && (cpValueStr != NULL))
		{
			configFileDelLeftTrim(cpNamePtr);
			configFileDelRightTrim(cpNamePtr);
			if(strcmp(cpNamePtr,cpName) == 0)
			{
				memset(srcBuf,0,sizeof(srcBuf));
				sprintf(srcBuf,"%s=%s\n",cpName,cpValue);
				findName = TRUE;
			}
		}
		write(fd,srcBuf,strlen(srcBuf));
		memset(buf,0,sizeof(buf));
	}

	if(findName == FALSE)
	{
		memset(srcBuf,0,sizeof(srcBuf));
		sprintf(srcBuf,"%s=%s\n",cpName,cpValue);
		write(fd,srcBuf,strlen(srcBuf));
	}
	close(fd);
	fclose(fp);
	remove(confFile);
	rename(configTempFile,confFile);
  system(" /bin/sync &");
	printf("configfile:%s writename:%s value:%s\n",confFile,cpName,cpValue);
	return 0;
}


/***********************************************************************
* 函数名   :configFileIntSet
* 功能描述 :
* 输入参数 : 无
* 输出参数 : 无
* 返回值   : 无
*/
int configFileIntSet(char *confFile,char *cpName,int iValue)
{
	char buf[64];

	memset(buf,0,sizeof(buf));
	sprintf(buf,"%d",iValue);
	return configFileStrSet(confFile,cpName,buf);
}




